package pyf.gaoji;

/**
 * @author pengyifeng
 * @version 5.1
 * @ClassName TestPcDemo.java
 * @Description 生产者/消费者模式 -管程法
 * @createTime 2021年07月27日 16:06:00
 */
public class TestPcDemo {
    public static void main(String[] args) {
        Container container=new Container();
        new Product(container).start();
        new Consumer(container).start();
    }

//生产者
static class Product extends Thread{
    Container container;
    Product(Container container){
        this.container=container;
    }
    @Override
    public void run() {
        //批量放100只鸡
        for (int i = 0; i < 100; i++) {
            try {
                container.push(new Chiken(i));
                System.out.println("生产了"+i+"只鸡");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}
//消费者
static class Consumer extends Thread{
    Container container;
    Consumer(Container container){
        this.container=container;
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                System.out.println("消费了"+container.pop().id+"只鸡");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


    }
}
//产品
static class Chiken{
    int id;
    public Chiken(int id) {
        this.id = id;
    }
}
//容器
static class Container{
    //计数器
    int num=0;
    //先定义容器大小,初始大小为10
    Chiken[] chikens=new Chiken[10];
    //放的方法,加入锁同步
    public synchronized void push(Chiken chiken) throws InterruptedException {
        //如果容器装满了则等待
        int cl= chikens.length;
        if(cl==num){
            this.wait();
        }
        chikens[num]=chiken;
        num++;
        //解除等待
        System.out.println(num);
        this.notifyAll();
    }
    //拿的方法，加入锁同步
    private synchronized Chiken pop() throws InterruptedException {
        //判断如果容器空了则等待生产者生产
        if(0== num){
            this.wait();
        }
        //取出产品
        num--;
        Chiken chiken = chikens[num];
        this.notifyAll();
        return chiken;
    }
}

}
